from Crypto.Cipher import AES
from Crypto.Util import Padding     # 用于加密数据分组填充


'''
# AES是目前使用最广泛的对称加密算法:
特点：
    分组加密：每次处理16字节的明文
    秘钥长度：
        AES-128: 128为秘钥（16字节）
        AES-192: 192为秘钥（24字节）
        AES-256: 256为秘钥（32字节）
    偏移量：固定16个字节
'''

# AES 相比DES更安全，两者用法相同，秘钥长度相差一倍
string1 = '个人身份信息abc123'

# 下方代码的秘钥可以更改为16字节（2-key）,和24 字节（3-key）长度
obj_ECB = AES.new('abcd1234qwer1234'.encode(),AES.MODE_CBC, iv='qwer1234plokmijn'.encode())   # 加密对象，调用encrypt和decrypt 实现加密和解密
obj_CBC = AES.new('abcd1234qwer1234plokmijn'.encode(),AES.MODE_CBC, iv='qwer1234plokmijn'.encode())   # 加密秘钥24字节
obj_CBC1 = AES.new('abcd1234qwer1234plokmijnlsdeeisb'.encode(),AES.MODE_CBC, iv='qwer1234plokmijn'.encode())   # 加密秘钥24字节
ECB_res = obj_ECB.encrypt(Padding.pad(string1.encode(),16,'x923'))
CBC_res = obj_CBC.encrypt(Padding.pad(string1.encode(),16,'x923'))
CBC1_res = obj_CBC1.encrypt(Padding.pad(string1.encode(),16,'x923'))
print(ECB_res)    # 加密结果
print(CBC_res)    # 加密结果
print(CBC1_res)    # 加密结果
print(string1.encode())   # 字符串转2进制


obj_ECB1 = AES.new('abcd1234qwer1234'.encode(),AES.MODE_CBC, iv='qwer1234plokmijn'.encode()) 
print(Padding.unpad(obj_ECB1.decrypt(ECB_res),16,'x923').decode())    # 解密